package com.rede.didiok.user.service;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.rede.didiok.common.dto.user.UserDto;
import com.rede.didiok.common.dto.user.UserLoginDto;
import com.rede.didiok.common.dto.user.UserRegistDto;
import com.rede.didiok.common.schema.ChatResponse.ChatGPTSetting;
import com.rede.didiok.common.utils.R;
import com.rede.didiok.user.entity.UserEntity;
import com.rede.didiok.user.exception.MobileExsitException;
import com.rede.didiok.user.exception.UserNameExistException;

/**
 * 用户表
 *
 * @author Rede
 * @email didiok@foxmail.com
 * @date 2023-08-07 18:21:17
 */
public interface UserService extends IService<UserEntity> {

    /***************************** didiok-admin:start **************************/
    // region  didiok-admin

    /**
     * 获取用户数
     *
     * @param status
     * @return
     */
    Integer getUserCount(int status);

    /**
     * 获取带头像的用户Map
     *
     * @param ids
     * @return
     */
    Map<String, UserEntity> getUserAvatarMapByIds(List<String> ids);

    /**
     * 获取带头像的用户Map
     *
     * @param ids
     * @return
     */
    Map<String, UserEntity> listUserNameAndAvatarByUids(List<String> ids);

    /**
     * 根据userUids 获取 开启邮件通知 的用户
     * @param userUids
     * @return
     */
    List<UserEntity> listUserStartEmailNotification(Set<String> userUids);

    /**
     * 获取用户列表
     *
     * @param userVO
     * @return
     */
    IPage<UserEntity> getPageList(UserDto userVO);

    /**
     * 获取用户记录
     *
     * @param userDto
     * @return
     */

    List<UserEntity> getUserPageRecords(UserDto userDto);

    /**
     * 新增用户
     *
     * @param userVO
     */
    String addUser(UserDto userVO);

    /**
     * 编辑用户
     *
     * @param userVO
     */
    String editUser(UserDto userVO);

    /**
     * 删除用户
     *
     * @param userVO
     */
    String deleteUser(UserDto userVO);

    /**
     * 重置用户密码
     *
     * @param userVO
     * @return
     */
    String resetUserPassword(UserDto userVO);

    /**
     * 用户第三方账号刷数
     */
    String flushUserAccount();

    /**
     * 获取TopN的用户【积分倒排】
     *
     * @return
     */
    IPage<UserEntity> getUserTopN(UserDto userVO);

    // endregion
    /***************************** didiok-admin:end **************************/



    /***************************** didiok-web:start **************************/
    // region didiok-web

    /**
     * 根据用户uid列表查询用户
     * @param uidList
     * @return
     */
    List<UserEntity> listUserByUids(List<String> uidList);

    /**
     * 关闭邮件通知
     * @param userUid
     * @return
     */
    UserEntity closeEmailNotificationById(String userUid);

    /**
     * 通过用户名查询相关用户信息
     *
     * @param keywords
     * @param currentPage
     * @param pageSize
     * @return
     */
    Map<String, Object> getByUser(String keywords, Long currentPage, Long pageSize);

    /**
     * 通过source uuid获取用户类
     *
     * @param source
     * @param socialUid
     * @return
     */
    UserEntity getUserBySourceAndSocialUid(String source, String socialUid);

    /**
     * 通过ids获取用户列表【携带用户头像和背景图片】
     *
     * @param ids
     * @return
     */
    List<UserEntity> getUserListAndAvatarByIds(Collection<String> ids);

    /**
     * 获取发表的文章数
     *
     * @param userUid
     * @return
     */
    Integer getRankMemberPublishCount(String userUid);

    /**
     * 通过uuid和source获取用户
     *
     * @return
     */
    UserEntity getUserByUuidAndSource(String uuid, String source);

    /**
     * 获取当前用户的积分
     *
     * @return
     */
    Integer getCurrentUserCredits(Boolean refresh);

    /**
     * 更新当前用户背景图片
     *
     * @param userVO
     * @return
     */
    String updateCurrentUserBackgroundImage(UserDto userVO);

    /**
     * 用户脱敏【去除敏感信息】
     */
    List<UserEntity> convertUserList(Collection<UserEntity> userList);

    /**
     * 查询积分总榜
     *
     * @return
     */
    List<UserEntity> getLeaderAll(Boolean refresh);

    /**
     * 获取用户钱包金额
     * @param userUid
     * @return
     */
    Long getUserAmount(String userUid);

    /**
     * 设置Request相关，如浏览器，IP，IP来源
     *
     * @param user
     * @return
     */
    UserEntity serRequestInfo(UserEntity user);


    // endregion
    /***************************** didiok-web:end **************************/


    /**
     * 登录
     * @param vo
     * @return
     */
    UserEntity login(UserLoginDto vo);

    /**
     * 注册
     * @param vo
     */
    void regist(UserRegistDto vo);

    /**
     * 检查手机号是否唯一
     * @param phone
     * @throws MobileExsitException
     */
    void checkMobileUnique(String phone) throws MobileExsitException;

    /**
     * 检查用户名是否唯一
     * @param username
     * @throws UserNameExistException
     */
    void checkUserNameUnique(String username) throws UserNameExistException;

    /**
     * 第三方登录接口
     * @param user
     * @return
     */
    UserDto oauthLogin(UserDto user);

    /**
     * 根据用户名获取用户信息
     *
     * @param userName 用户名
     * @return
     */
    UserEntity getByUserName(String userName);

    /**
     * 根据用户昵称获取用户信息
     * @param nickname
     * @return
     */
    List<UserEntity> getByNickname(String nickname);

    /**
     * 用户脱敏【去除敏感信息】
     */
    UserDto convertUser(UserDto user);

    /**
     * 设置用户头像, 批量方法
     *
     * @param list
     */
    void setUserAvatar(Collection<UserEntity> list);



    /**
     * 记录用户信息
     *
     * @param response
     */
    UserEntity insertUserInfo(HttpServletRequest request, String response);


    /**
     * 通过ids获取用户列表
     *
     * @param ids
     * @return
     */
    List<UserEntity> getUserListByIds(List<String> ids);


    /**
     * 通过id获取用户【携带用户头像和背景图片】
     *
     * @param id
     * @return
     */
    UserEntity getUserListAndAvatarById(String uid);


    /**
     * 通过ids获取用户列表【“不”携带用户头像和背景图片】
     * @param userUids
     * @return
     */
    List<UserEntity> getUserListWithoutAvatarByIds(Collection<String> ids);


    /**
     * 设置用户头像
     *
     * @return
     */
    UserEntity setUserAvatar(UserEntity user);

    /**
     * 判断用户是否被封禁： true：正常，false：封禁
     *
     * @param userUid
     */
    Boolean getUserActiveStatus(String userUid);


    /**
     * 用户脱敏【去除敏感信息】
     */
    UserEntity convertUser(UserEntity user);


    /**
     * 设置用户发布的信息【博客数、问答数、评论数】
     *
     * @param list
     */
    void setUserPublishInfo(Collection<UserEntity> list);

    /**
     * 更新用户积分
     *
     * @param userUid
     * @param credits
     */
    void updateCreditsByUserUid(String userUid, Integer credits);

    /**
     * 更新用户经验值
     *
     * @param userUid
     * @param expValue
     */
    void updateExpValueByUserUid(String userUid, Integer expValue);

    /**
     * 获取用户排名
     *
     * @param userUid
     * @return
     */
    Integer getUserRank(String userUid, boolean refresh);

    /**
     * 获取所有的机器人用户
     *
     * @return
     */
    Map<String, UserEntity> getRobotUserList();

    /**
     * 获取个人中心网址
     *
     * @return
     */
    String getUserCenterUrl(String userUid);

    /**
     * 校验是否可以回复
     *
     * @param userUid
     * @return
     */
    ChatGPTSetting checkRobotReply(String userUid, int userTag);

    /**
     * chatGPT自动回复
     *
     * @param openID
     * @param message
     * @return
     */
    String chatGPTReply(String openID, String message);

    /**
     * 获取用户UID
     *
     * @return
     */
    String getUserUidByRequest();

    /**
     * 用户钱包金额消耗
     * @param userUid
     * @return
     */
    void updateAmountByUserUid(String userUid, Long amount);

    /**
     * 根据用户名找用户
     *
     * @param username
     * @return
     */
    UserEntity getUserByUserName(String username);

    /**
     * 获取文章被访问数
     *
     * @param userUid
     * @return
     */
    Integer getRankMemberVisitCount(String userUid);

    /**
     * at事件通用处理方法
     * @param userUid
     * @param toUserUid
     * @param toUid
     * @param bizUid
     * @param bizType
     * @param message
     * @param isAt
     * @return
     */
    R atEventHandler(String userUid, String toUserUid, String toUid, String bizUid, String bizType, String message, boolean isAt);
}

